/** getComponentType (获取组件类型)方法说明
 * @author: JasonStandFor
 * @description Desc:: 判断一个 节点对象 是 类组件 或 函数式组件
 * @param {() => (React.ReactNode | React.ReactElement)} component - 接收函数式组件 或 类组件
 * @param {React.isValidElement} isValidElement - 来自于 React 库, 判断是否为节点对象
 * @return boolean - true: 函数式组件 false: 类组件
 * @example:
 getComponentType({}, React.isValidElement); => false
 getComponentType(() => <div>测试组件<div/>, React.isValidElement); => true
 **/
export const getComponentType = (component = {}, isValidElement) => {
  let flag = false;
  try {
    if (!isValidElement) {
      throw new Error('warning: 你可能需要从 React 库引入 isValidElement 方法');
    }
    // console.log('type: ', typeof component.type);
    if (typeof component === 'function') {
      if (typeof component.prototype.isReactComponent === 'object') {
        // 类组件
        console.log('类组件: todo...');
        // if (!isValidElement(component)) {
        //   throw new Error('warning: 该对象不是一个节点元素');
        // }
        return flag;
      }
      if (typeof component.prototype.isReactComponent === 'undefined') {
        // 函数式组件
        // console.log('函数式组件: todoSomething...');
        if (!isValidElement(component())) {
          throw new Error(`warning: ${component} 该函数不是一个节点元素`);
        }
        flag = true;
      }
      return flag;
    }
    throw new Error(`warning: 传入的 ${component} 不是一个 function!`);
  } catch (e) {
    console.warn(e);
  }
  return flag
};

/** notEmptyObject (非空对象判断)方法说明
* @author: JasonStandFor
* @description Desc:: ES5写法，只接收 object 实例对象，此方法不校验数组，数组会直接返回 false
* @param {Object} obj - object 实例对象
* @return boolean
* @example:
notEmptyObject({}}); => false
notEmptyObject({ a: 1 }}); => true
**/
export const notEmptyObject = (obj) => {
  let data = null;
  // 优化性能，不是对象类不走此 if
  if (obj && Object.values(obj).length) {
    try {
      // 拦截数组
      if (!obj.length && obj.toString() === '[object Object]') {
        data = obj;
        // for (const key in obj) {
        //   data = key;
        //   if (!key) {
        //     throw new Error(`unexpected. 'This is not an object'`);
        //   }
        // }
      }
    } catch (err) {
      console.error(err);
    }
  }
  return !!data;
};

/** isEmptyObject (是空对象判断)方法说明
* @author: JasonStandFor
* @description Desc:: ES6写法，只接收 object 实例对象，此方法不校验数组，数组会直接返回 false
* @param {Object} obj - object 实例对象
* @return boolean
* @example:
isEmptyObject({}}); => true
isEmptyObject({ a: 1 }}); => false
**/
export const isEmptyObject = (obj) => {
  if (obj && obj.toString() === '[object Object]') {
    return Reflect.ownKeys(obj).length === 0 && obj.constructor === Object;
  }
  return false;
}
